﻿Imports OpenHardwareMonitor.Hardware

Public Class OHM_Info

    Dim MioComputer As Computer
    Dim VCoreTemporaneo As String

    Public Utilizzo(0) As Double
    Public Temperatura(0) As Double
    Public UtilizzoMassimo(0) As Double
    Public TemperaturaMassima(0) As Double
    Public VCore As Double
    Public NumeroCPU As Integer
    Public NumeroCore As Integer
    Public NomeCPU As String
    Public Frequenza As Double
    Public FSB As Double
    Public Moltiplicatore As Double

    Public Sub New()
        MioComputer = New Computer
        MioComputer.Open()
        MioComputer.MainboardEnabled = True
        MioComputer.CPUEnabled = True
    End Sub

    Public Sub UpdateInfo()
        ResettaVariabili()

        For Each ComponenteHardware As IHardware In MioComputer.Hardware
            ComponenteHardware.Update()

            'numero e nome della CPU
            If ComponenteHardware.HardwareType = HardwareType.CPU Then NumeroCPU += 1
            If ComponenteHardware.HardwareType = HardwareType.CPU Then NomeCPU = ComponenteHardware.Name

            'numero di core
            For Each SensorePresente As ISensor In ComponenteHardware.Sensors
                SensorePresente.Hardware.Update()
                If SensorePresente.Hardware.HardwareType = HardwareType.CPU And SensorePresente.SensorType = SensorType.Load And Not SensorePresente.Name.ToString.Contains("Total") Then NumeroCore += 1
            Next
        Next

        If NumeroCPU > 1 Then NumeroCore = NumeroCore / NumeroCPU ' se c'è più di una CPU, il numero di core per CPU viene calcolato di conseguenza
        If NumeroCPU < 1 Then Exit Sub 'se ci sono meno di 1 CPU, esco perché do per buono che non è supportata

        ReDim Utilizzo(NumeroCPU * NumeroCore)
        ReDim Temperatura(NumeroCPU * NumeroCore)
        ReDim UtilizzoMassimo(NumeroCPU * NumeroCore)
        ReDim TemperaturaMassima(NumeroCPU * NumeroCore)

        'calcolo l'indice degli array e gli assegno il giusto valore
        Dim IndiceCPU As Integer = 1
        Dim IndiceCore As Integer = 1
        For Each ComponenteHardware As IHardware In MioComputer.Hardware

            If ComponenteHardware.HardwareType = HardwareType.CPU Then
                For j = 1 To NumeroCPU
                    If ComponenteHardware.Identifier.ToString.Contains(j - 1) Then IndiceCPU = j
                Next
            Else
                Continue For
            End If

            For Each SensorePresente As ISensor In ComponenteHardware.Sensors
                If SensorePresente.Hardware.HardwareType = HardwareType.CPU Then 'utilizzo
                    If SensorePresente.SensorType = SensorType.Load Then
                        For k = 1 To NumeroCore
                            If SensorePresente.Name.ToString.Contains("#" & k) Then IndiceCore = k
                        Next
                        Utilizzo(IndiceCPU * IndiceCore) = SensorePresente.Value
                        UtilizzoMassimo(IndiceCPU * IndiceCore) = SensorePresente.Max
                    End If

                    If SensorePresente.SensorType = SensorType.Temperature Then 'temperatura
                        For k = 1 To NumeroCore
                            If SensorePresente.Name.ToString.Contains("#" & k) Then IndiceCore = k
                        Next
                        Temperatura(IndiceCPU * IndiceCore) = SensorePresente.Value
                        TemperaturaMassima(IndiceCPU * IndiceCore) = SensorePresente.Max
                    End If

                    If SensorePresente.SensorType = SensorType.Clock Then 'frequenza
                        If Not SensorePresente.Name.ToString.Contains("Bus") Then
                            If Not Frequenza = 0 Then Frequenza = (Frequenza + SensorePresente.Value) / 2 Else Frequenza = SensorePresente.Value
                        Else
                            FSB = SensorePresente.Value
                        End If
                    End If
                End If
            Next

        Next

        'Moltiplicatore
        If Not FSB = 0 Then Moltiplicatore = Math.Round(Math.Round(Frequenza, 2) / Math.Round(FSB, 2), 1)

        'VCore
        For Each ComponenteHardware As IHardware In MioComputer.Hardware
            If ComponenteHardware.HardwareType = HardwareType.Mainboard Then
                For Each ComponenteHardwareFiglio In ComponenteHardware.SubHardware
                    ComponenteHardware.Update()
                    ComponenteHardwareFiglio.Update()
                    For Each SensorePresenteFiglio In ComponenteHardwareFiglio.Sensors
                        If SensorePresenteFiglio.Name.ToString.Contains("CPU VCore") Then VCore = SensorePresenteFiglio.Value
                    Next
                Next
            End If
        Next
    End Sub

    Sub ResettaVariabili()
        NumeroCPU = 0
        NumeroCore = 0
        NomeCPU = ""
        VCore = 0
        VCoreTemporaneo = ""
        Frequenza = 0
        FSB = 0
        Moltiplicatore = 0
        ReDim Utilizzo(0)
        ReDim Temperatura(0)
        ReDim UtilizzoMassimo(0)
        ReDim TemperaturaMassima(0)
    End Sub

End Class
